﻿using System.Collections.Generic;
using System.Linq;
using System.Text;
using IndignadoFramework.BackBone.Model;
using IndignadoFramework.DataAccessLayer.EntityModels;

namespace IndignadoFramework.BackBone.InternalServices.Implementacion
{
    public class OrigenDeDatosServicesImpl : OrigenDeDatosServices
    {
        public int crearOrigenDeDatos(int movimientoId, OrigenDeDatosModel origenDeDatosModel)
        {
            // mapea el origen de dados
            OrigenDeDato origenDatosEntity = new OrigenDeDato();
            AutoMapper.Mapper.CreateMap<OrigenDeDatosModel, OrigenDeDato>();
            origenDatosEntity = AutoMapper.Mapper.Map(origenDeDatosModel, origenDatosEntity);


            // guarda el origen de datos y sus filtros en la base
            using (IndignadoFrameworkEntities context = new IndignadoFrameworkEntities())
            {
                Movimiento movimientoEntity = context.Movimientos.First(i => i.Id == movimientoId);
                movimientoEntity.OrigenDeDato.Add(origenDatosEntity);
                context.SaveChanges();
            }

            // copia el id que se persistió en la base
            int origenDeDatosId = origenDatosEntity.Id;

            List<FiltroModel> filtros = origenDeDatosModel.getFiltros();
            foreach (FiltroModel filtro in filtros)
            {
                this.crearFiltroParaOrigenDeDatos(movimientoId, origenDeDatosId, filtro);
            }
            return origenDeDatosId;
        }

        public int crearFiltroParaOrigenDeDatos(int movimientoId, int origenDeDatosId, FiltroModel filtro)
        {
            // mapea el filtro
            Filtro filtroEntity = new Filtro();
            AutoMapper.Mapper.CreateMap<FiltroModel, Filtro>();
            filtroEntity = AutoMapper.Mapper.Map(filtro, filtroEntity);

            // guarda el filtro en la base
            using (IndignadoFrameworkEntities context = new IndignadoFrameworkEntities())
            {
                OrigenDeDato origenDeDatosEntity = context.OrigenDeDatos.First(i => i.MovimientoId == movimientoId && i.Id == origenDeDatosId);
                origenDeDatosEntity.Filtro.Add(filtroEntity);
                Movimiento movimientoEntity = context.Movimientos.First(i => i.Id == origenDeDatosEntity.MovimientoId);
                movimientoEntity.Filtro.Add(filtroEntity);
                context.SaveChanges();
            }
            return filtroEntity.Id;
        }

        public IEnumerable<OrigenDeDatosModel> getOrigenesDeDatos(int movimientoId)
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            IQueryable<OrigenDeDato> listaDeOrigenesDeDatosEntity = from o in context.OrigenDeDatos.Include("Filtro")
                                                                       where o.MovimientoId == movimientoId
                                                                       select o;
            List<OrigenDeDatosModel> listaDeorigenDeDatosModel = new List<OrigenDeDatosModel>();

            foreach (OrigenDeDato origenDeDatoEntity in listaDeOrigenesDeDatosEntity)
            {
                OrigenDeDatosModel origenDeDatoModel = new OrigenDeDatosModel();
                AutoMapper.Mapper.CreateMap<OrigenDeDato, OrigenDeDatosModel>();
                origenDeDatoModel = AutoMapper.Mapper.Map(origenDeDatoEntity, origenDeDatoModel);

                ICollection<Filtro> listaFiltrosEntity = origenDeDatoEntity.Filtro;
                foreach (Filtro filtroEntity in listaFiltrosEntity)
                {
                    FiltroModel filtroModel = new FiltroModel();
                    AutoMapper.Mapper.CreateMap<Filtro, FiltroModel>();
                    filtroModel = AutoMapper.Mapper.Map(filtroEntity, filtroModel);
                    origenDeDatoModel.addFiltro(filtroModel);
                }
                listaDeorigenDeDatosModel.Add(origenDeDatoModel);
            }
            return listaDeorigenDeDatosModel;
        }

        public IEnumerable<OrigenDeDatosModel> getOrigenesDeDatos()
        {
            IndignadoFrameworkEntities context = new IndignadoFrameworkEntities();
            IQueryable<OrigenDeDato> listaDeOrigenesDeDatosEntity = from o in context.OrigenDeDatos.Include("Filtro")
                                                                    select o;
            List<OrigenDeDatosModel> listaDeorigenDeDatosModel = new List<OrigenDeDatosModel>();

            foreach (OrigenDeDato origenDeDatoEntity in listaDeOrigenesDeDatosEntity)
            {
                OrigenDeDatosModel origenDeDatoModel = new OrigenDeDatosModel();
                AutoMapper.Mapper.CreateMap<OrigenDeDato, OrigenDeDatosModel>();
                origenDeDatoModel = AutoMapper.Mapper.Map(origenDeDatoEntity, origenDeDatoModel);

                ICollection<Filtro> listaFiltrosEntity = origenDeDatoEntity.Filtro;
                foreach (Filtro filtroEntity in listaFiltrosEntity)
                {
                    FiltroModel filtroModel = new FiltroModel();
                    AutoMapper.Mapper.CreateMap<Filtro, FiltroModel>();
                    filtroModel = AutoMapper.Mapper.Map(filtroEntity, filtroModel);
                    origenDeDatoModel.addFiltro(filtroModel);
                }
                listaDeorigenDeDatosModel.Add(origenDeDatoModel);
            }
            return listaDeorigenDeDatosModel;
        }

        public void modificarOrigenDeDato(OrigenDeDatosModel origen)
        {
            // guarda el origen de datos y sus filtros en la base
            using (IndignadoFrameworkEntities context = new IndignadoFrameworkEntities())
            {
                OrigenDeDato origenEntity = context.OrigenDeDatos.First(i => i.Id == origen.Id);
                origenEntity.OrigenDeDatoData = origen.OrigenDeDatoData ;
                context.SaveChanges();
            }
        }
    }
}
